package disenioPantallas.ActividadesCampo;

import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JTable;

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import disenioPantallas.AnimalesDataSource;
import disenioPantallas.RegistrosDataSource;
import disenioPantallas.elementos.EButton;
import disenioPantallas.elementos.EPanel;
import disenioPantallas.elementos.FrameAutenticado;
import disenioPantallas.elementos.MyTableModel;
import disenioPantallas.elementos.panelGeneral;
import entidades.Campo;
import entidades.Potrero;
import gestores.GestorCampo;
import gestores.GestorErrores;
import gestores.GestorSistema;

import javax.swing.JLabel;


import java.awt.FlowLayout;
import java.util.Vector;

import javax.swing.JScrollPane;
import javax.swing.border.TitledBorder;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.JTextArea;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.engine.util.JRLoader;

import actionListeners.MascaraMayusculakeyListener;

public class FichaCampo extends panelGeneral {

	private static final long serialVersionUID = 1L;
	
	private GestorSistema gSistema=GestorSistema.getGestorSistema();
	private GestorCampo gCampo=GestorCampo.getGestorCampo();
	private Campo campoActual=gCampo.getCampoActual();
	private JTable table;
	private JScrollPane scrollPaneRegistro;
	private JScrollPane scrollPaneCaracteristicas;
	private JLabel lbTitulo;
	private JTextArea txArea;

	public FichaCampo() {
		super();
		setPreferredSize(new Dimension(900, 700));
		setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

		JPanel panelTitulo = new JPanel();
		panelTitulo.setOpaque(false);
		add(panelTitulo);
		panelTitulo.setLayout(new BoxLayout(panelTitulo, BoxLayout.X_AXIS));
		
		String titulo=String.format("Ficha del Campo: [Seleccionar]");
		lbTitulo = new JLabel(titulo);
		panelTitulo.add(lbTitulo);
		lbTitulo.setFont(new Font("Cambria", Font.PLAIN, 24));
		
		Component verticalStrut = Box.createVerticalStrut(80);
		add(verticalStrut);

		
		JPanel panelCentral = new JPanel();
		panelCentral.setOpaque(false);
		add(panelCentral);
		
		panelCentral.setLayout(new BoxLayout(panelCentral, BoxLayout.X_AXIS));
		
		JPanel panelCampo = new JPanel();
		panelCampo.setPreferredSize(new Dimension(600, 500));
		panelCampo.setMaximumSize(new Dimension(600, 500));
		panelCentral.add(panelCampo);
		panelCampo.setOpaque(false);
		panelCampo.setLayout(new BoxLayout(panelCampo, BoxLayout.Y_AXIS));
		
		scrollPaneRegistro = new JScrollPane();
		panelCampo.add(scrollPaneRegistro);
		scrollPaneRegistro.setMaximumSize(new Dimension(450, 300));
		scrollPaneRegistro.setBorder(new TitledBorder(null, "Lista de Potreros", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		scrollPaneRegistro.setPreferredSize(new Dimension(400, 300));
		scrollPaneRegistro.setMinimumSize(new Dimension(450, 300));
		
		table = new JTable();
		scrollPaneRegistro.setViewportView(table);
		
		Component verticalStrut_3 = Box.createVerticalStrut(10);
		panelCampo.add(verticalStrut_3);
		scrollPaneCaracteristicas = new JScrollPane();
		scrollPaneCaracteristicas.setBorder(new TitledBorder(null, "Caracateristicas", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		scrollPaneCaracteristicas.setPreferredSize(new Dimension(500, 100));
		scrollPaneCaracteristicas.setMaximumSize(new Dimension(450, 100));
		panelCampo.add(scrollPaneCaracteristicas);
		
		txArea = new JTextArea();
		txArea.setEnabled(false);
		scrollPaneCaracteristicas.setViewportView(txArea);

				
		JPanel panelOperaciones = new JPanel();
		panelCentral.add(panelOperaciones);
		panelOperaciones.setPreferredSize(new Dimension(200, 400));
		panelOperaciones.setAlignmentX(Component.LEFT_ALIGNMENT);
		panelOperaciones.setOpaque(false);
		panelOperaciones.setLayout(new BoxLayout(panelOperaciones, BoxLayout.Y_AXIS));
		panelOperaciones.setMaximumSize(new Dimension(200, 500));
		
		Component verticalStrut_1 = Box.createVerticalStrut(50);
		panelOperaciones.add(verticalStrut_1);
		
		JPanel panel = new JPanel();
		panel.setOpaque(false);
		panel.setAlignmentX(Component.LEFT_ALIGNMENT);
		panelOperaciones.add(panel);
		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
		
		EPanel panel_5 = new EPanel();
		panel_5.setMaximumSize(new Dimension(160, 50));
		panel.add(panel_5);
		
		EButton btnSeleccionar = new EButton("SELECCIONAR");
		btnSeleccionar.setPreferredSize(new Dimension(160, 35));
		panel_5.add(btnSeleccionar);
		btnSeleccionar.addActionListener(new SeleccionarAction());
		
		EPanel panel_3 = new EPanel();
		panel_3.setMaximumSize(new Dimension(160, 50));
		panel.add(panel_3);
		
		EButton btnCaracteristicas = new EButton("CARACTERISTICAs");
		btnCaracteristicas.setText("CARACTERISTICAS");
		btnCaracteristicas.setPreferredSize(new Dimension(160, 35));
		panel_3.add(btnCaracteristicas);
		btnCaracteristicas.addKeyListener(new MascaraMayusculakeyListener());
		btnCaracteristicas.addActionListener(new caracteristicasAction());
		
		JPanel panel_1 = new EPanel();
		panel.add(panel_1);
		panel_1.setMaximumSize(new Dimension(160, 50));
		
		JButton btnRegistrosDelluvia = new EButton("LLUVIAS");
		btnRegistrosDelluvia.setPreferredSize(new Dimension(160, 35));
		panel_1.add(btnRegistrosDelluvia);
		btnRegistrosDelluvia.addActionListener(new RegistrosAction());
		
		JPanel panel_2 = new EPanel();
		panel.add(panel_2);
		panel_2.setMaximumSize(new Dimension(160, 50));
		
		JButton btnActividades = new EButton("ACTIVIDADES");
		btnActividades.setPreferredSize(new Dimension(160, 35));
		panel_2.add(btnActividades);
		btnActividades.addActionListener(new ActividadesAction());
		
		EPanel panel_4 = new EPanel();
		panel.add(panel_4);
		panel_4.setMaximumSize(new Dimension(160, 50));
		
		EButton btnExportar = new EButton("EXPORTAR");
		btnExportar.setPreferredSize(new Dimension(160, 35));
		panel_4.add(btnExportar);
		btnExportar.addActionListener(new ExportarAction());
		
		Component verticalGlue = Box.createVerticalGlue();
		panelOperaciones.add(verticalGlue);
		
		Component verticalGlue_2 = Box.createVerticalGlue();
		add(verticalGlue_2);
		
		JPanel panelBotones = new JPanel();
		panelBotones.setOpaque(false);
		panelBotones.setMaximumSize(new Dimension(32767, 70));
		add(panelBotones);
		panelBotones.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
		
		JButton btnSalir = new EButton("Salir");
		panelBotones.add(btnSalir);
		btnSalir.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				((FrameAutenticado) gSistema.getFrame()).quitarCU();} });
		
		
		

		
		}
	
	private class RegistrosAction extends AbstractAction{

		
		private static final long serialVersionUID = 1L;

		public void actionPerformed(ActionEvent arg0) {
			if(gCampo.getCampoActual()!=null){
				DRegistrosDeLLuvia dialog=new DRegistrosDeLLuvia();
				dialog.activarDG();
			}else{
				GestorErrores.getGestorErrores().mostrarCartelError("Seleccione un Campo");
			}
			
		}
		
	}
	
	private class ActividadesAction extends AbstractAction{

		
		private static final long serialVersionUID = 1L;

		public void actionPerformed(ActionEvent arg0) {
			if(gCampo.getCampoActual()!=null){
				DRegistrosDeActividades dialog=new DRegistrosDeActividades();
				dialog.activarDG();
			}else{
				GestorErrores.getGestorErrores().mostrarCartelError("Seleccione un Campo");
			}

			
		}
		
	}

	private class SeleccionarAction extends AbstractAction{

		
		private static final long serialVersionUID = 1L;

		public void actionPerformed(ActionEvent arg0) {
			DSeleccionarCampo dialog=new DSeleccionarCampo();
			dialog.activarDG();
			campoActual=gCampo.getCampoActual();
			actualizarCampos();
			
		}
		
	}
	private void actualizarCampos(){
		
		lbTitulo.setText("Ficha del Campo: "+campoActual.getNombreCampo());
		txArea.setText(campoActual.getCaracteristicas());
		table.setModel(new listadoPotreros(campoActual.getPotreros()));
		
	}
	
	
	private class listadoPotreros extends MyTableModel {

		private static final long serialVersionUID = 1L;
		
		public listadoPotreros(Vector<Potrero> potreros){
			super();
			
			String[] columnas={"ID","NOMBRE DEL POTRERO"};
			setColumnNames(columnas);
			Object[][] info= new Object[0][2];
			setColumnNames(columnas);

			if(potreros.size()>0){
				info= new Object[potreros.size()][2];
				for(int i=0;i<potreros.size();i++){
					info[i][0]=potreros.get(i).getIdPotrero();
					info[i][1]=potreros.get(i).getNombrePotrero();
				}
			}
			setInfo(info);
			boolean[] edits= {false,false};
			setEdits(edits);
			
			
			
		}
	
	}

	private class caracteristicasAction extends AbstractAction{
		private static final long serialVersionUID = 1L;

		@Override
		public void actionPerformed(ActionEvent arg0) {
			if(gCampo.getCampoActual()!=null){
				DCaracteristicasCampo dialog=new DCaracteristicasCampo();
				dialog.activarDG();
				txArea.setText(gCampo.getCampoActual().getCaracteristicas());
				
			}else{
				GestorErrores.getGestorErrores().mostrarCartelError("Seleccione un Campo");
			}

			
			
		}
		
	}
	
	public class ExportarAction extends AbstractAction{
		private static final long serialVersionUID = 1L;
		private GestorErrores gError=GestorErrores.getGestorErrores();

		public void actionPerformed(ActionEvent arg0) {
			DExportarCampo dialog= new DExportarCampo();
			dialog.activarDG();
			if(dialog.isAceptar()){
				JFileChooser filechooser= new JFileChooser();
				FileNameExtensionFilter filtro=new FileNameExtensionFilter("Archivos PDF (*.pdf)","pdf");
				filechooser.setFileFilter(filtro);
				filechooser.setDialogTitle("Exportar Resultado");
				filechooser.setMultiSelectionEnabled(false);
				filechooser.setAcceptAllFileFilterUsed(false);
				if(filechooser.showSaveDialog(null)==JFileChooser.APPROVE_OPTION){
					String rutaArchivo=filechooser.getSelectedFile().toString().concat(".pdf");
				    
					RegistrosDataSource datasource = new RegistrosDataSource(); 
					Vector<Campo> campos= new Vector<Campo>();
					if(dialog.isCampoActual()) campos.add(campoActual);
					else try { campos=gCampo.getCamposEncontrados(); } catch (Throwable e1) { 
						// TODO Auto-	
						e1.printStackTrace(); gError.mostrarCartelError(e1.getMessage());						}

					if(dialog.isLluvias()){
						for(int i=0;i<campos.size();i++){
							for(int j=0;j<campos.get(i).getRegistrosDeLluvia().size();j++){
								datasource.add(campos.get(i).getRegistrosDeLluvia().get(j));
							}
						}
					}

					if(dialog.isActividades()){
						for(int i=0;i<campos.size();i++){
							for(int k=0;k<campos.get(i).getPotreros().size();k++){
								for(int j=0;j<campos.get(i).getPotreros().get(k).getActividades().size();j++){
									datasource.add(campos.get(i).getPotreros().get(k).getActividades().get(j));
								}
							}
						}
					}


			        JasperReport reporte;
					try {
						reporte = (JasperReport) JRLoader.loadObject("reportRegistros.jasper");

				        JasperPrint jasperPrint;
							jasperPrint = JasperFillManager.fillReport(reporte, null, datasource);
						
					        JRExporter exporter = new JRPdfExporter();  
					        exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
					        exporter.setParameter(JRExporterParameter.OUTPUT_FILE, new java.io.File(rutaArchivo)); 
							exporter.exportReport();
							gError.mostrarCartelAdvertencia("Se ha Creado Correctamente");

					} catch (JRException e) {
						// TODO Auto-generated catch block
						gError.mostrarCartelError(e.getMessage());
						e.printStackTrace();
					}  
						
				}
			} 
		}
		
	}
	@Override
	public void cargarCampos() {
		if(campoActual==null){
			DSeleccionarCampo dialog=new DSeleccionarCampo();
			dialog.activarDG();
			if(gCampo.getCampoActual()!=null){
				campoActual=gCampo.getCampoActual();
				actualizarCampos();
			}
		}

	}
	
		
}